/* 
 * Swap Nodes in Pairs
 * Given a linked list, swap every two adjacent nodes and return its head.
 * For example, Given 1->2->3->4, you should return the list as 2->1->4->3
 */

#include "../../func.h"

ListNode *swapPairs(ListNode *head)
{
    if (nullptr == head || nullptr == head->next)
        return head;
    
    ListNode dummy(-1);
    dummy.next = head;

    for (ListNode *prev = &dummy, *cur = prev->next, *next = cur->next;
    next;
    prev = cur, cur = cur->next, next = cur ? cur->next : nullptr)
    {
        prev->next = next;
        cur->next = next->next;
        next->next = cur;
    }
    return dummy.next;
}

ListNode *swapPairs2(ListNode *head) {
    ListNode *p = head;
    while (p && p->next)
    {
        swap(p->val, p->next->val);
        p = p->next->next;
    }
    return head;
}